package injector;

import annotation.*;

public class Binder<T> {
	
	private Binding<T> binding;
	
	/**
	 * Interface associee au Binder
	 */
	private Class<T> iface;
	
	/**
	 * Constructeur
	 * @param iface Interface associee au Binder
	 */
	public Binder(Class<T> iface) {
		this.iface = iface;
		binding = new DefaultBinding<T>(iface);
	}
	
	/**
	 * Methode qui compare une interface donnee avec l'interface associee au Binder
	 * @param iface Interface a comparer
	 * @return True si l'interface est la meme
	 */
	public boolean apply(Class<?> iface) {
		return binding.apply(iface);
	}
	
	/**
	 * Injection d'un champ
	 * @param impl Classe a injecter
	 */
	public void to(Class<T> impl) {
		binding = new DefaultBinding<T>(impl);
		// A remplacer par une nouvelle implementation de Binding (non fait)
	}
	
	/**
	 * Injection par annotation des champs
	 */
	public void annotatedWith() {
		// Non faite
	}

	/**
	 * Creation d'une instance
	 * @return La nouvelle instance
	 */
	public T newInstance() {
		return binding.newInstance();
	}

	Class<T> getIface() {
		return iface;
	}
}
